/**
 * Classe que realiza o interfaceamento entre o sistema com o banco de dados.
 * Nesta classe contém os métodos necessarios para a conexão com um banco de dados
 * existente e para construção de um novo banco de dados.
 * 
 * OBS: Atualmente (07/06/2015, versão 3.5) só é armazenado as informações dos sites calibrados (createTabelaNotaDoSite), ou seja, o site e a nota. 
 * Caso precise armazenar outras informações sobre proteinas e epítopos as rotinas estão prontas, bastando fazer ajustes conforme a necessidade.
 * 
 */
package epibot.BancoDeDados;

import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Rafael Tosta
 */
public class SQLiteEpibot {

    private final String NOME_BANCO = "Epibot_DataBase.epidb";

    /**
     * Este método estabelece uma conexão com um banco de dados definido através
     * de uma URL.
     *
     * @param url URL do arquivo do banco de dados
     * @return Retorna o objeto que possui a conexão com o banco
     * @throws ClassNotFoundException
     */
    public Statement getBD() {
        Statement stm = null;
        File arq = new File(NOME_BANCO);
        if (arq.exists()) { // se arquivo do banco existir  
            //System.out.println("exist");
            try {
                Class.forName("org.sqlite.JDBC");
                //estabelece a conecao com o banco
                Connection con = DriverManager.getConnection("jdbc:sqlite:" + NOME_BANCO);
                stm = con.createStatement();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(SQLiteEpibot.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(SQLiteEpibot.class.getName()).log(Level.SEVERE, null, ex);
            }

        } else { //cria novo banco
            try {
                Class.forName("org.sqlite.JDBC");
                //estabelece a conecao com o banco
                Connection connection = DriverManager.getConnection("jdbc:sqlite:" + NOME_BANCO);
                stm = connection.createStatement();

                //tabelas a serem criadas
                this.createTabelaSites(stm);
                this.createTabelaNotaDoSite(stm);

            } catch (SQLException ex) {
                Logger.getLogger(SQLiteEpibot.class.getName()).log(Level.SEVERE, null, ex);
            } catch (Exception ex) {
                Logger.getLogger(SQLiteEpibot.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        return stm;
    }

    /**
     * Cria a tabela Proteinas
     * Tabela que armazena as informações das proteínas
     *
     * @param stm Conexão com o banco
     */
    private void createTabelaProteinas(Statement stm) {
        String sql = "create table proteinas( "
                + "cod_proteina varchar(20) primary key not null,"
                + "informacao varchar(4096) not null,"
                + "sequencia varchar(204840) not null"
                + ");";
        try {
            stm.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage() + " :: createTabelaProteinas");
        }
    }

    /**
     * Cria a tabela Scores.
     * Tabela que armazena os scores de cada epitopo
     *
     * @param stm Conexão com o banco
     */
    private void createTabelaEpitopos(Statement stm) {
        String sql = "create table epitopos ( "
                + "cod_proteina varchar(20) not null,"
                + "epitopo varchar(20) not null,"
                + "id_site integer not null,"
                + "score varchar(15) not null,"
                + "data varchar(10) not null,"
                + "alelo varchar(10) not null,"//coloquei esses dois para facilitar
                + "tamanho varchar(10) not null,"
                + "posicao integer not null"
                + ");";
        try {
            stm.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage() + " :: createTabelaScores");
        }
    }

    /**
     * Cria a tabela Site
     * Tabela que armazena as informações de cada site que foi consultado
     *
     * @param stm Conexão com o banco
     */
    private void createTabelaSites(Statement stm) {
        String sql = "create table sites ( "
                + "id_site integer primary key AUTOINCREMENT,"
                + "nome varchar(100) not null unique,"
                + "link varchar(10000)"
                + ");";
        try {
            stm.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage() + " :: createTabelaSites");
        }

    }

    /**
     * Cria a tabela NotaDoSite
     * Tabela que armazena a nota de cada site conforme os calibradores
     * 
     * @param stm Conexão com o banco
     */
    private void createTabelaNotaDoSite(Statement stm) {
        //tem que conter ainda alelo e tamanho que irá definir o grupo de calibragem!!!
        String sql = "create table notasdosite ( "
                + "nome_calibragem varchar(512) not null,"
                + "id_site integer not null,"
                + "nota varchar(20) not null,"
                + "alelo varchar(10) not null,"
                + "tamanho varchar(10) not null"
                + ");";

        try {
            stm.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage() + " :: createTabelaNotaDoSite");
        }
    }

    private void createTabelaCalibradores(Statement stm) {
        String sql = "create table calibradores ( "
                + "nome_calibragem varchar(512) not null,"
                + "cod_proteina varchar(20) not null,"
                + "epitopo varchar(20) not null,"
                + "tamanho varchar(10) not null"
                + ");";
        try {
            stm.executeUpdate(sql);
        } catch (SQLException ex) {
            System.out.println(ex.getMessage() + " :: createTabelaSites");
        }

    }
}
